24. 两两交换链表中的节点

https://leetcode.cn/problems/swap-nodes-in-pairs/description/

给你一个链表，两两交换其中相邻的节点，并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题（即，只能进行节点交换）

struct ListNode* swapPairs(struct ListNode* head){
    if(head==NULL)
    {
        return NULL;
    }
    if(head->next==NULL)
    {
        return head;
    }
    struct ListNode*n1=head,*n2=n1->next;
    struct ListNode*cur=head;
    struct ListNode*rhead=NULL,*tail=NULL;
    while(cur)
    {
        if(rhead==NULL)
        {
            rhead=tail=n2;
            cur=n2->next;
            n2->next=n1;
            tail=tail->next;
        }
        else
        {
            tail->next=n2;
            if(n2)
            {
                cur=n2->next;
                n2->next=n1;
                tail=tail->next->next;                   
            }
            else
            {
                cur=n2;
                tail->next=n1;
                tail=tail->next;
            }           
        }
        if(cur)
        {
            n1=cur;
            n2=cur->next;            
        }
    }
    tail->next=NULL;
    return rhead;
}